#include "TcpServer.hpp"
#include <memory>
#include <string>
#include "threadpool/LockGuard.hpp"
#include "threadpool/Thread_Pool.hpp"

#include <time.h>
#include <sys/time.h>


// thread_pool TODO
// 这里要考虑一个问题，什么作为任务Task的单元
// 1. 每一个Task，每一个小的逻辑 √
// 2. 还是每次发来的报文
// timedeline TODO

Response calculator(const Request &req)
{
    Response res(0, 0, req._x, req._y, req._op);
    switch (req._op)
    {
    case '+':
        res._result = req._x + req._y;
        break;
    case '-':
        res._result = req._x - req._y;
        break;
    case '*':
        res._result = req._x * req._y;
        break;
    case '/':
        if (req._y == 0)
            res._status = 2; // 除0错误
        else
            res._result = req._x / req._y;
        break;
    case '%':
        if (req._y == 0)
            res._status = 3; // 求余0错误
        else
            res._result = req._x % req._y;
        break;
    default:
        res._status = 4; // 未定义符号
        break;
    }
    return res;
}

void handler_task(const std::string &message, Connection *con)
{
    // 处理任务的逻辑
    //////////////////////////////////////////////
    // a. 反序列化
    Request rq;
    Response rs;
    if (!rq.Deserialize(message)) // 反序列化错误
    {
        rs._status = 1;
    }
    // b. 处理业务
    else
    {
        rs = calculator(rq);
    }
    // c. 序列化
    std::string response = rs.Serialize();
    // d. 把数据交给连接
    {    
        // 问题1. 我这里觉得因为多线程解决完任务之后是要再把respond写回到发送缓冲区，
        // 所以这个发送缓冲区就算是临界资源，但是后面测试发现好像不加锁也没问题，为什么呢？
        LockGuard(&(con->_send_write_lock));
        con->_send_buffer += Encode(response); // buffer是临界资源
    }
    // e. 设置启动项
    con->_tcpserver_ptr->EnableReadWrite(con, true, true);
}

void handler(Connection *con)
{
    // 1. 解决粘包问题，把字符串放进vector里
    // Messagelog(NORMAL, "buffersize %d, recvbuffer: %s", con->_recv_buffer.size(), con->_recv_buffer.c_str());
    Messagelog(NORMAL, "buffersize %d", con->_recv_buffer.size());
    std::vector<std::string> v_message;
    while (true)
    {
        std::string message = Decode(con->_recv_buffer);
        // std::cout << message << "!!" << std::endl;
        if (message.empty())
            break;
        v_message.push_back(move(message));
    }
    // 2. 遍历vector，拿到string
    Thread_Pool<Task>* poolptr = Thread_Pool<Task>::Creat_Threadpool();
    for (auto &mes : v_message)
    {
        Task task(mes, con, handler_task);
        poolptr->push_task(task);
    }
}

int main()
{
    Thread_Pool<Task>* poolptr = Thread_Pool<Task>::Creat_Threadpool(10);
    poolptr->run();
    std::unique_ptr<TcpServer> svr(new TcpServer);
    svr->Dispather(handler);
    return 0;
}
// TODO一个reactor的listener负责监听和一些reactor负责拿和处理自己的事件
// connect的回收问题，share_ptr智能指针管理
// 时间管理器。。。